import os
import torch
import aiohttp
import asyncio
import numpy as np
from typing import List, Tuple
from tqdm.asyncio import tqdm_asyncio
from dotenv import load_dotenv
from data_v_1_0 import load_answer, load_reference_only


load_dotenv("../250430.env")  # 自动加载.env文件
print(os.getenv("EMBEDDING_API_KEY"))

print(torch.__version__)
print(torch.cuda.is_available())
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f"Using device: {device}")



class AsyncEmbeddingCalculator:
    def __init__(self, api_key: str, model_name: str = "bge-m3", max_retries: int = 3):
        self.api_url = "http://10.10.252.225:8000/v1-openai/embeddings"
        self.headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }
        self.model = model_name
        self.max_retries = max_retries
        self.semaphore = asyncio.Semaphore(3)  # TODO:并发量

    async def get_embeddings(self, texts: List[str], batch_size: int = 32) -> List[List[float]]:
        """异步批量获取文本嵌入向量"""
        results = []
        batches = [texts[i:i + batch_size] for i in range(0, len(texts), batch_size)]

        async def process_batch(batch):
            async with self.semaphore:
                for attempt in range(self.max_retries):
                    try:
                        async with aiohttp.ClientSession() as session:
                            payload = {
                                "model": self.model,
                                "input": batch,
                                "encoding_format": "float"
                            }
                            async with session.post(
                                    self.api_url,
                                    headers=self.headers,
                                    json=payload,
                                    timeout=aiohttp.ClientTimeout(total=30)
                            ) as response:
                                response.raise_for_status()
                                data = await response.json()
                                return [item["embedding"] for item in data["data"]]
                    except Exception as e:
                        if attempt == self.max_retries - 1:
                            raise
                        await asyncio.sleep(2 ** attempt)  # 指数退避

        tasks = [process_batch(batch) for batch in batches]
        results = await tqdm_asyncio.gather(*tasks, desc="获取嵌入向量")
        return [emb for batch in results for emb in batch]


class ChatbotEvaluator:
    # ... 保留原有初始化代码 ...

    async def async_evaluate(self, references: List[str], predictions: List[str]):
        """异步评估函数"""
        embedding_calc = AsyncEmbeddingCalculator(os.getenv("EMBEDDING_API_KEY"))

        # 获取所有嵌入向量
        all_texts = references + predictions
        embeddings = await embedding_calc.get_embeddings(all_texts)
        ref_embs = embeddings[:len(references)]
        pred_embs = embeddings[len(references):]

        # 计算余弦相似度
        bert_scores = []
        for ref, pred in zip(ref_embs, pred_embs):
            cos_sim = np.dot(ref, pred) / (np.linalg.norm(ref) * np.linalg.norm(pred))
            bert_scores.append((cos_sim + 1) / 2)  # 归一化到0-1范围
            print(cos_sim)

        # 后续处理与原有代码相同...
        self.total_bert = torch.tensor(sum(bert_scores), device=device)
        self.count = torch.tensor(len(bert_scores), device=device)

        # 保存和返回结果...
        print()


async def main():
    evaluator = ChatbotEvaluator()
    references = ["""以下从员工信息多系统自动采集的角度，对人力、党建、科技、荣誉资质四大领域的典型场景进行详细分析。每个领域设计10个以上场景，包含场景说明、字段信息、涉及系统及自动采集价值：

一、人力资源管理领域
1. 职称评审自动化申报
场景说明：
员工申报职称时自动整合工作履历、科研成果、培训记录等数据，减少重复提交证明材料。

字段信息：

基础信息（HR系统）：姓名、工号、部门、职级
教育背景（教育系统）：学历证书编号、学位类型
工作经历（HR系统）：入职时间、岗位变更记录
成果数据（科技系统）：专利号、论文发表记录
培训记录（培训系统）：继续教育学时
涉及系统：HR系统、培训管理系统、科研管理系统
自动采集价值：减少员工手动整理材料时间90%

（其他9个场景示例：薪资核算数据校验、绩效考核多维度评分、培训需求智能匹配、档案数字化归档、用工风险预警、退休手续一键办理、人才发展路径规划、岗位胜任力分析、员工自助信息更新）

二、党建管理领域
1. 党员信息动态维护
场景说明：
通过HR系统同步组织架构变化，自动更新党员所在支部信息。

字段信息：

岗位信息（HR系统）：所属部门/项目部
组织关系（党建系统）：党支部编号、入党时间
流动党员状态（项目管理系统）：外派驻地、归队时间
涉及系统：党建云平台、HR系统、项目管理系统
自动采集价值：消除手动调整支部归属的滞后性

（其他场景包含：党费自动计算、三会一课自动备案、民主评议数据整合、廉洁档案建设、组织关系跨省转接、先进典型库建设、红色教育基地预约、积分考核自动统计、党建经费可视化等）

三、科技创新管理领域
1. 科研项目申报预审
场景简述：
自动核验申报人资质有效性（注册证书有效期+项目经验）和团队合规性。

核心字段：

资质证书（资质系统）：注册师编号、有效期
项目经历（项目系统）：已参与项目数量/级别
考核结果（HR系统）：近三年绩效评级
系统联动：科研管理系统、项目管理系统、HR系统
降本增效：申报通过率提升20%，人工审核降低70%

（其余场景覆盖：知识产权智能推荐、实验物资统筹调配、跨单位协作数据互通、研发费用归集、科技成果转化跟踪、创新人才画像、设备资源共享、技术标准库调用等）

四、荣誉资质管理领域
1. 建设工程资质申报
场景描述：
自动抓取所有在建项目技术负责人注册证书状态和企业人员社保缴纳记录。

关键字段：

人员证书（培训系统）：一级建造师编号
社保信息（财务系统）：连续缴费月数
项目清单（项目系统）：在建工程规模数据
系统集成：资质管理系统、财务系统、项目管理系统
价值体现：减少资质维护专职岗位3-5人

（补充场景如：个人职业资格延续提醒、企业信用分预警、投标资格自动审查、奖项申报材料生成、资质使用动态监控、行业协会数据报送、继续教育学时核验等）

五、体系化建设关键点
主数据管理
建立员工信息主数据库，形成唯一可信数据源（ESB企业服务总线+数据湖）

智能比对引擎
开发逻辑校验规则库（如资质有效性自动核验算法）

隐私合规设计
设置数据分级授权策略（如党员信息脱敏处理）

移动端整合
开发统一员工服务门户，集成生物识别认证

持续优化机制
建立AI驱动的数据质量监测模型，动态修正字段映射关系

通过构建跨系统数据中台，预计可总体降低员工填报工作量80%以上，业务审批效率提升50%，同时为人才培养、组织发展提供精准数据支撑。需重点关注跨部门权责界定和系统对接的标准化改造。"""]
    # 您好，同方股份的签到规定可能不同部门之间会不太一样。建议您查看公司内部通知、员工手册或直接咨询HR部门信息。如果有其他能帮到您的地方，随时告诉我~
    predictions = [""""以下是从员工信息多系统自动采集、避免重复填报视角，针对中核工程人力、党建、科技、荣誉资质四大领域的典型场景分析，每个领域详细列举10个场景，包含场景说明、字段信息和涉及系统：

---

### **一、人力资源领域**
1. **职称评审自动化**
   - **场景说明**：自动抓取员工学历、工作年限、项目经历等数据，减少手动填报。
   - **字段信息**：姓名、工号、学历证书编号（学信网接口）、任职年限（HR系统）、项目角色（项目管理系统）、发表论文（科技系统）。
   - **涉及系统**：HR系统、项目管理系统、科技管理系统、学信网。

2. **年度绩效考核**
   - **场景说明**：整合项目参与度（PM系统）、培训完成率（培训系统）、考勤数据（考勤系统）。
   - **字段信息**：项目贡献评分、培训课时、迟到早退次数、奖惩记录（党建系统）。
   - **涉及系统**：HR系统、项目管理系统、培训系统、考勤系统、党建系统。

3. **员工福利发放**
   - **场景说明**：自动识别员工职级、工会会员状态、家庭情况（如婚姻、子女数量）。
   - **字段信息**：职级（HR系统）、工会会费缴纳状态（工会系统）、配偶信息（员工自助填报）、子女出生证明（OA附件）。
   - **涉及系统**：HR系统、工会管理系统、OA系统。

4. **跨部门借调审批**
   - **场景说明**：自动验证员工技能证书（科技系统）、当前项目负荷（PM系统）、政治面貌（党建系统）。
   - **字段信息**：专业技能证书编号、当前项目工时、党员身份、部门负责人审批意见。
   - **涉及系统**：HR系统、项目管理系统、党建系统、科技系统。

5. **新员工入职办理**
   - **场景说明**：自动预填学历、职称信息，同步开通各系统账号。
   - **字段信息**：身份证号（自动验真）、银行卡号（财务系统）、紧急联系人（员工自助）。
   - **涉及系统**：HR系统、财务系统、门禁系统、IT运维系统。

6. **退休手续办理**
   - **场景说明**：自动计算工龄、提取荣誉记录（荣誉系统）、党费缴纳截止日期。
   - **字段信息**：入职日期、荣誉称号列表、党费缴纳月份、社保账号。
   - **涉及系统**：HR系统、党建系统、荣誉系统、社保平台。

7. **人才盘点分析**
   - **场景说明**：综合绩效、技能证书、专利成果等生成人才九宫格。
   - **字段信息**：绩效考核等级（HR）、专利数量（科技系统）、外语水平（培训系统）。
   - **涉及系统**：HR系统、科技系统、培训系统、BI平台。

8. **培训需求匹配**
   - **场景说明**：根据项目类型（PM系统）和员工技能缺口（HR系统）推荐课程。
   - **字段信息**：当前项目技术栈、员工技能证书过期时间、历史培训记录。
   - **涉及系统**：培训系统、项目管理系统、HR系统。

9. **薪资核算自动化**
   - **场景说明**：整合考勤、项目奖金、党费代扣等数据。
   - **字段信息**：加班时长（考勤系统）、项目奖金系数（PM系统）、党费基数（党建系统）。
   - **涉及系统**：财务系统、考勤系统、项目管理系统、党建系统。

10. **员工健康管理**
    - **场景说明**：对接体检报告（医疗系统）、高危工种标识（HR系统）。
    - **字段信息**：体检异常指标、工种风险等级、应急联系人。
    - **涉及系统**：医疗系统、HR系统、EHS管理系统。

---

### **二、党建领域**
1. **党员发展流程**
   - **场景说明**：自动校验员工绩效（HR系统）、违纪记录（纪检系统）。
   - **字段信息**：近3年考核等级、廉洁承诺书签署状态、入党申请书提交时间。
   - **涉及系统**：党建系统、HR系统、纪检系统。

2. **党费自动计算**
   - **场景说明**：同步薪资数据（财务系统）、党员职级（HR系统）。
   - **字段信息**：基本工资、津补贴、党费比例、补缴月份。
   - **涉及系统**：党建系统、财务系统、HR系统。

（因篇幅限制，党建、科技、荣誉资质领域其他场景以简表形式呈现，实际可扩展为同等详细程度）

| **领域**       | **场景名称**               | **关键字段示例**                          | **涉及系统**                          |
|----------------|---------------------------|------------------------------------------|---------------------------------------|
| **党建**       | 3. 党组织关系转接          | 转出/转入党组织名称、党员档案存放地       | 党建系统、档案管理系统                |
|                | 4. 民主评议党员            | 群众评议分数（OA投票）、年度绩效等级       | 党建系统、HR系统、OA                  |
|                | ...（共10项）              |                                          |                                       |
| **科技**       | 1. 专利申报审核            | 发明人工号、项目编号、技术领域分类          | 科技系统、HR系统、项目管理系统        |
|                | 2. 科研经费报销            | 项目预算余额、参与人员列表、发票验真结果    | 科技系统、财务系统、税务平台          |
|                | ...（共10项）              |                                          |                                       |
| **荣誉资质**   | 1. 院士推荐材料生成         | 科技奖项列表（科技系统）、政治审查结果       | 荣誉系统、科技系统、党建系统          |
|                | 2. 企业资质年审             | 员工注册证书有效期、继续教育学时            | 荣誉系统、培训系统、行业协会平台      |
|                | ...（共10项）              |                                          |                                       |

---

### **三、实现建议**
1. **技术架构**：建议采用主数据管理（MDM）平台作为核心，通过ESB总线实现系统间数据实时同步。
2. **数据治理**：建立《员工信息数据标准》，明确"姓名"工号"等关键字段为全系统唯一标识。
3. **员工端**：开发统一信息门户，员工只需在一处维护基础信息，各系统按权限订阅更新。

需要任一领域的完整10个场景详细说明或技术实施方案，可进一步沟通扩展。"""]
    await evaluator.async_evaluate(references, predictions)

if __name__ == "__main__":
    asyncio.run(main())